package com.yunji.system.dao.impl;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.yunji.common.base.BaseDaoImpl;
import com.yunji.common.constant.LogicCode;
import com.yunji.common.model.domain.NoticeDO;
import com.yunji.common.model.domain.NoticeUserDO;
import com.yunji.common.model.params.NoticeParams;
import com.yunji.common.model.vo.NoticeVO;
import com.yunji.common.utils.bean.BeanUtils;
import com.yunji.system.dao.INoticeUserDao;
import com.yunji.system.mapper.INoticeUserMapper;
import javafx.util.Pair;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class NoticeUserDaoImpl extends BaseDaoImpl<INoticeUserMapper, NoticeUserDO> implements INoticeUserDao {
    @Override
    public Integer countUnread(Pair<String, Long> param) {
        return lambdaQuery().eq(NoticeUserDO::getReadStatus, LogicCode.NO).eq(NoticeUserDO::getUserType,param.getKey())
                .eq(NoticeUserDO::getUserId,param.getValue()).count().intValue();
    }

    @Override
    public List<NoticeVO> getPageList(NoticeParams params) {
        MPJLambdaWrapper<NoticeUserDO> wrapper = new MPJLambdaWrapper<>();
        MPJLambdaWrapper<NoticeUserDO> mpj = wrapper.select(NoticeDO::getNoticeType).select(NoticeDO::getMessageType)
                .select(NoticeDO::getNoticeTitle).selectAs(NoticeDO::getNoticeContent,"jsonContent")
                .selectAll(NoticeUserDO.class).innerJoin(NoticeDO.class,NoticeDO::getNoticeId,NoticeUserDO::getNoticeId)
                .eq(NoticeUserDO::getUserId,params.getUserId())
                .eq(NoticeUserDO::getUserType,params.getUserType())
                .eq(BeanUtils.isNotNull(params.getMessageType()),NoticeDO::getMessageType,params.getMessageType())
                .orderByDesc(NoticeUserDO::getCreateTime);
        return selectJoinList(NoticeVO.class,mpj);
    }

    @Override
    public void allRead(Pair<String, Long> param) {
       update(new LambdaUpdateWrapper<NoticeUserDO>()
               .set(NoticeUserDO::getReadStatus, LogicCode.YES)
               .eq(NoticeUserDO::getUserType,param.getKey())
               .eq(NoticeUserDO::getUserId,param.getValue()));
    }
}
